/***********************************************************************************
 * 文件名： bmlite.h
 * 版本： 2
 * 说明：
 * 		一个极度精简的电池管理组件，提供基本的电池事件通知。
 *      在合适的地方调用 BMLite_Loop() 确保其在100ms左右执行一次。在程序启动时调用一次
 *  BMLite_Init() 初始化本组件。通过 BMLite_SetRefreshStatus 可以暂时关闭或者启动状态刷新。
 *  可以调用对应的函数接口主动获取一些状态，这些接口在头文件中有申明和说明。当有状态变化时，
 *  本组件会通过调用 BMLite_Event 来进行通知，你必须在需要接收通知的地方定义 BMLite_Event 
 *  函数，它的使用类似一个中断函数，通过名称来识别，函数原型为 
 *  void BMLite_Event(bmlite_ev_t e)。
 *      必须在 bmlite_config.h 文件中进行合适的配置，本组件才能工作在你期望的状态。
 * 修改记录：
 * 	2021/04/29: 初版。 刘言。
 *  2021/05/07: 增加获取电池电量的功能。刘言。
***********************************************************************************/
#ifndef _BMLITE_H_
#define _BMLITE_H_

#include <stddef.h>
#ifdef __NO_INCLUDE_PATH
#include "..\..\..\projects\prj\bsp\bmlite_config.h"
#else
#include "bsp-bmlite_config.h"
#endif
#include "polsys.h"

typedef enum _bmlite_ev
{
    BMLITE_EV_NULL,
    BMLITE_EV_DC_PULL_IN,
    BMLITE_EV_DC_PULL_OUT,
    BMLITE_EV_START_CHARGE,
    BMLITE_EV_CHARGE_FULL,
    _BMLITE_EV_END
} bmlite_ev_t;

// 仅仅是为了使用伪函数优化而曝光以下属性

extern bit _BMLite_mRunning;
extern bit _BMLite_mIsCharging;
extern bit _BMLite_mDCConnected;
extern bit _BMLite_mNoBattery;
#ifdef _BMLITE_USE_BATT_LEVEL
extern u8 _BMLite_mLevel;
#endif

// APIS

// 初始化
#define BMLite_Init()            \
    {                            \
        _BMLite_mRunning = true; \
    }

// 100ms执行一遍用于刷新电池状态
void BMLite_Loop();

// 设置刷新状态
// 开启或者关闭状态刷新
#define BMLite_SetRefreshStatus(bool_new_stat) \
    {                                          \
        _BMLite_mRunning = bool_new_stat;      \
    }

// 获取是否正在充电的状态
#define BMLite_IsCharging() _BMLite_mIsCharging

// 获取充电器是否已连接的状态
#define BMLite_DCConnected() _BMLite_mDCConnected

// 获取是否没电的状态
#define BMLite_NoBattery() _BMLite_mNoBattery

#ifdef _BMLITE_USE_BATT_LEVEL
// 获取电量百分比
#define BMLite_GetBattLevel() _BMLite_mLevel
#else
#define BMLite_GetBattLevel() 0
#endif

#endif
